/* 
给定一个整数数据流和一个窗口大小，根据该滑动窗口的大小，计算滑动窗口里所有数字的平均值。

实现 MovingAverage 类：

MovingAverage(int size) 用窗口大小 size 初始化对象。
double next(int val) 成员函数 next 每次调用的时候都会往滑动窗口增加一个整数，请计算并返回数据流中最后 size 个值的移动平均值，即滑动窗口里所有数字的平均值。


输入：
inputs = ["MovingAverage", "next", "next", "next", "next"]
inputs = [[3], [1], [10], [3], [5]]
输出：
[null, 1.0, 5.5, 4.66667, 6.0]

解释：
MovingAverage movingAverage = new MovingAverage(3);
movingAverage.next(1); // 返回 1.0 = 1 / 1
movingAverage.next(10); // 返回 5.5 = (1 + 10) / 2
movingAverage.next(3); // 返回 4.66667 = (1 + 10 + 3) / 3
movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3


思路：根据题意，计算出最后size个值的平均值，可以考虑用队列解决，没超过size时加入计算数组求和，超过size时从队列头部移除掉，并且和减去移除项


*/

/**
 * Initialize your data structure here.
 * @param {number} size
 */
 var MovingAverage = function(size) {
    // 计算数组
    this.nums=[]
    // 窗口大小
    this.size=size
    // 求和
    this.sum=0
};

/** 
 * @param {number} val
 * @return {number}
 */
MovingAverage.prototype.next = function(val) {
    // 添加进计算数组
    this.nums.push(val)
    // 求和
    this.sum+=val
    // 计算数组长度超过窗口size
    if(this.nums.length>this.size){
        // 移除前面的项并且之前的和减去移除项
        this.sum-=this.nums.shift()
    }
    return this.sum/this.nums.length
    
};


let movingAverage = new MovingAverage(3);
movingAverage.next(1); // 返回 1.0 = 1 / 1
movingAverage.next(10); // 返回 5.5 = (1 + 10) / 2
movingAverage.next(3); // 返回 4.66667 = (1 + 10 + 3) / 3
movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
